const ChatAi = {}

/**
 * 生成一条聊天室的消息的唯一ID
 */
function msgUuid() {
  if (!msgUuid.next) {
    msgUuid.next = 0
  }
  return 'msg-' + (++msgUuid.next)
}

/**
 * 生成用户问的消息内容格式
 */
function createUserMessage(content, isMe) {
  return {
    id: msgUuid(),
    type: 'speak',
    content,
    isMe
  }
}

//  声明聊天室页面
Page({
  /**
   * 聊天室使用到的数据，主要是消息集合以及当前输入框的文本
   */
  data: {
    messages: [],
    inputContent: '请输入内容...',
    lastMessageId: 'none',
  },

  /**
   * 切换回前台
   */
  onShow() {
  },

  onLoad() {
    this.initChat()
  },

  initChat() {
    // 初始化AI链接
    this.ChatAi = wx.Bmob.ChatAI()

    // 返回消息处理，因为是以流的形式返回AI生成的结果，所以这里处理稍微复杂一些
    let msg = ''
    let isStart = true
    this.ChatAi.onMessage((res) => {
      if (isStart) {
        isStart = false
      }
      if (res == "done") {
        //  完成
        if (msg != "") {
          isStart = true
        } 
        msg = '';
      } else {
        msg = msg + res
        this.amendMessage(createUserMessage(msg, false))
      }
    })

    this.ChatAi.onClose((c) => {
      console.log("连接被关闭，准备重新连接Bmob AI服务");
      this.ChatAi.connect()
    })
  },

  /**
   * 页面卸载时
   */
  onUnload() {
  },

  /**
   * 页面切换到后台运行时
   */
  onHide() {
  },


  /**
   * 通用更新当前消息集合的方法
   */
  updateMessages(updater) {
    var messages = this.data.messages
    updater(messages)
    this.setData({
      messages: messages
    })
    // this.messages = messages

    // 需要先更新messagess，再设置滚动位置，否则不能生效
    var lastMessageId = messages.length ? messages[messages.length - 1].id : 'none'
    this.setData({
      lastMessageId
    })
  },

  /**
   * 追加一条消息
   */
  pushMessage(message) {
    this.updateMessages(messages => messages.push(message))
  },

  /**
   * 替换上一条消息
   */
  amendMessage(message) {
    if (message.content == "") {
      return
    }
    this.updateMessages(messages => messages.splice(-1, 1, message))
  },

  /**
   * 用户输入的内容改变之后
   */
  changeInputContent(e) {
    this.setData({
      inputContent: e.detail.value,
      lastMessageId: this.data.lastMessageId
    })
  },

  /**
   * 点击「发送」按钮，通过信道推送消息到服务器
   **/
  sendMessage(e) {
    var content = this.data.inputContent
    if (!content) {
      return false
    }

    // 设置发送给服务器的信息
    let datas = {
      "messages": [{
        "content": content,
        "role": "user"
      }],
      "session": "bmobchat"
    }
    //执行发送
    this.ChatAi.send(JSON.stringify(datas))
    //在UI中显示对话内容
    this.pushMessage(createUserMessage(content, true))
    this.pushMessage(createUserMessage("AI思考中...",false))
    //设置输入框内容为空
    this.setData({
      inputContent: ''
    })
  },
})